﻿//kotori拿到了一些正整数。她决定从每个正整数取出一个素因子。
//但是，kotori有强迫症，她不允许两个不同的正整数取出相同的素因子。
//
//她想知道，最终所有取出的数的和的最小值是多少？
//
//注：若amodk == 0，则称k 是a 的因子。
//若一个数有且仅有两个因子，则称其是素数。显然1只有一个因子，不是素数。
//
//输入描述:
//	第一行一个正整数n ，代表kotori拿到正整数的个数。
//	第二行共有n 个数ai，表示每个正整数的值。
//	保证不存在两个相等的正整数。1≤n≤10,2≤ai≤1000
//
//输出描述 :
//	一个正整数，代表取出的素因子之和的最小值。若不存在合法的取法，则输出 - 1。
//
//输入
//	4
//	12 15 28 22
//输出
//	17
//说明
//	分别取3，5，7，2，可保证取出的数之和最小
//
//输入
//	5
//	4 5 6 7 8
//输出
//	- 1

#include <iostream>
#include <cmath>
using namespace std;
const int N = 15, M = 1010; int n, arr[N];
bool use[M]; // 记录路径中⽤了哪些值
int path; // 记录当前路径中所有元素的和
int ret = 0x3f3f3f3f; // 统计最终结果
bool isPrim(int x)
{
	if (x <= 1) return false;
	for (int i = 2; i <= sqrt(x); i++)
	{
		if (x % i == 0) return false;
	}
	return true;
}
void dfs(int pos)
{
	if (pos == n)
	{
		ret = min(ret, path);
		return;
	}

	// 枚举 arr[pos] 的所有没有使⽤过的素因⼦
	for (int i = 2; i <= arr[pos]; i++)
	{
		if (arr[pos] % i == 0 && isPrim(i) && !use[i])
		{
			path += i;
			use[i] = true;
			dfs(pos + 1);
			// 回溯 - 恢复现场
			path -= i;
			use[i] = false;
		}
	}
}
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++) cin >> arr[i];

	dfs(0);

	if (ret == 0x3f3f3f3f) cout << -1 << endl; else cout << ret << endl;

	return 0;
}